package main

import (
	"context"
	"fmt"
	"os"
	"os/signal"
	"syscall"
	"time"

	_ "gitee.com/liuxiaowei123/vblog-3/app"
	"gitee.com/liuxiaowei123/vblog-3/protocol"

	// tokenimpl "gitee.com/liuxiaowei123/vblog-3/app/token/impl"
	// userimpl "gitee.com/liuxiaowei123/vblog-3/app/user/impl"
	"gitee.com/liuxiaowei123/vblog-3/conf"
	"gitee.com/liuxiaowei123/vblog-3/ioc"
)

func main() {
	// 1、加载配置
	err := conf.LoadFromEnv()
	if err != nil {
		panic(err)
	}

	// 2、初始化模块，也就是初始化模块中的controller
	// usercontroller := userimpl.NewUserServiceImpl()
	// tokencontroller := tokenimpl.NewTokenServiceImpl(usercontroller)
	// tokenapihandler := api.NewTokenApiHandler(tokencontroller)
	ioc.Controller().Init()
	ioc.Apihandler().Init()

	// 3、设置路由；转到protocol中实现
	// gin.Default() 初始化了一个Gin引擎实例，也就是创建了一个带有基本日志和错误恢复功能的Web服务器实例。
	// r := gin.Default()
	// r1 := r.Group("/api/vblog3")
	// ioc.Apihandler().RouterRegistry(r1)

	// 4、启动程序
	// Address := fmt.Sprintf("%s:%d", conf.C.Api.Apihost, conf.C.Api.Apiport)
	// fmt.Printf("程序启动并监听%s", Address)
	// r.Run(Address)  // 这行代码启动了Gin引擎，并让它监听在指定的Address上

	// 5、重新定义3、4
	httpserver := protocol.NewHttpServer()
	// 5.1、用携程启动程序
	go func() {
		err := httpserver.Run()
		if err != nil {
			fmt.Println(err)
			// os.Exit(1)会导致整个程序退出，而不仅仅是这个gorouting退出
			os.Exit(1)
		}
	}()
	// 5.2、处理信号
	ch := make(chan os.Signal, 1)
	// signal.Notify() 是用来监听操作系统发送的信号并将它们发送到前面创建的通道
	// 信号分别为：terminated、interrupt、hangup、quit
	signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP, syscall.SIGQUIT)
	// 5.3、等待信号的到来
	c := <-ch
	fmt.Println(c)
	// 5.4、关闭程序，并定义超时时长
	// cancel 是一个取消函数。当你想提前结束与这个上下文相关的操作时，你可以调用这个取消函数
	ctx, cancle := context.WithTimeout(context.Background(), time.Second*3)
	defer cancle()
	httpserver.ShutDown(ctx)
	// 5.5、关闭程序后的清理工作
	fmt.Println("程序关闭后的清理工作")

}
